# -*- coding: utf-8 -*-

# @author Anderson R. Livramento
# Copyright (C) 2008 Anderson Rodrigues Livramento <anderdevel@users.sourceforge.net>
#
# O conteúdo deste arquivo está disponível dentro dos termos 
# da Licença Pública Geral GNU como publicada pela 
# Fundação do Software Livre (FSF); na versão 2 da Licença, ou
# (na sua opnião) qualquer versão mais recente.
#
# Este programa é distribuído na esperança que possa ser útil,
# mas SEM NENHUMA GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a
# qualquer MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a
# Licença Pública Geral GNU para maiores detalhes.
#
# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob
# o título "LICENCA.txt", junto com este programa; se não, escreva para
# a Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor,
# Boston, MA  02110-1301  US
#
import logging
import datetime
import formencode
import simplejson

import votafam.model.votafammodel as dao
import votafam.lib.objectutils as objectutils

from votafam.lib.base import *

log = logging.getLogger(__name__)

class VotacaoController(BaseController):

    def index(self):
        c.dt = request.params.get('dt',None)
        if c.dt:
            c.list = dao.Votacao.query.filter_by(dtvotacao=h.str_to_date(c.dt))
        else:
            c.list = dao.Votacao.query.all()
        return render('/admin/lista_votacoes.mako')
    
    def edit(self,id):
        if id:
            votacao = dao.Votacao.query.filter_by(cdvotacao=id).first()
            c.form_result = objectutils.object_to_dict(votacao)
            if votacao.r_candidatos:
                candidate_list = []
                for candidate in votacao.r_candidatos:
                    candidate_list.append({
                        'cdcandidato':candidate.cdcandidato,
                        'idcandidato':candidate.r_candidato.idcandidato,
                        'nmcandidato':candidate.r_candidato.nmcandidato
                    })
                c.candidate_list = simplejson.dumps(candidate_list)
        else:
            c.form_result = model.new_from(model.get_model('Votacao').table,dtvotacao=datetime.date.today())
        return render('/admin/cad_votacao.mako')

    def save(self,id):
        schema = model.forms.VotacaoForm()
        try:
            candidate_list_str = request.params.get('candidate_list','[]')
            form_result = schema.to_python(request.params)
            req_votacao = None
            if id:
                req_votacao = dao.Votacao.query.filter_by(cdvotacao=id).first()
                objectutils.copy_dict(form_result,req_votacao)
                # Apagando os candidatos dessa votacao
                table = model.get_model('VotacaoCandidato').table
                delete_stm = table.delete(whereclause=table.c.cdvotacao==req_votacao.cdvotacao)
                model.Session.execute(delete_stm)
            else:
                req_votacao = form_result
            votacao = model.save_or_update(req_votacao,dao.Votacao)
            # Inserindo os candidatos dessa votacao
            candidate_list = simplejson.loads(candidate_list_str)
            if candidate_list:
                insert_list = []
                for candidate in candidate_list:
                    insert_list.append({
                        'cdvotacao': votacao.cdvotacao,
                        'cdcandidato': candidate['cdcandidato']
                    })
                model.Session.execute(model.get_model('VotacaoCandidato').table.insert(),insert_list)
                
            c.form_result = objectutils.object_to_dict(votacao)
            c.alert_message = 'Vota&ccedil;&atilde;o salvo com sucesso'
        except formencode.Invalid,e:
            c.form_result = e.value
            c.form_result['r_mostra'] = {'nmmostra': request.params.get('nmmostra','')}
            c.form_errors = model.forms.get_errors(e.error_dict,schema)
            c.alert_message = 'Campos com problemas:'
        c.candidate_list = candidate_list_str
        return render('/admin/cad_votacao.mako')
    
    def activate(self,id):
        if id:
            votacao = dao.Votacao.query.filter_by(cdvotacao=id).first()
            if votacao.flativa == 0:
                votacao.flativa = 1
            else:
                votacao.flativa = 0
            votacao = model.save_or_update(votacao,dao.Votacao)
            del votacao
            # deixando todas as outras desativadas
            table = model.get_model('Votacao').table
            update_st = table.update(whereclause=table.c.cdvotacao<>id,values={'flativa':0})
            model.Session.execute(update_st)
            model.Session.commit()
        return self.index()